/**
 * API响应处理器
 * @module utils/apiHandler
 * @author 互成一家
 * @description 统一处理API响应和错误
 */

/**
 * 成功响应处理
 * @param {Object} response - API响应对象
 * @returns {Promise} 处理后的Promise
 */
export const handleSuccess = (response) => {
  // 如果响应成功并且存在data字段，直接返回data
  if (response && response.code === 0) {
    return Promise.resolve(response.data);
  }
  
  // 否则返回整个响应对象
  return Promise.resolve(response);
};

/**
 * 错误响应处理
 * @param {Object} error - 错误对象
 * @param {boolean} [showToast=true] - 是否显示提示
 * @returns {Promise} 处理后的Promise
 */
export const handleError = (error, showToast = true) => {
  console.error('API请求错误:', error);
  
  // 获取错误信息
  let message = '网络请求失败，请稍后重试';
  
  if (error) {
    if (error.message) {
      message = error.message;
    } else if (error.msg) {
      message = error.msg;
    } else if (typeof error === 'string') {
      message = error;
    }
  }
  
  // 显示错误提示
  if (showToast) {
    uni.showToast({
      title: message,
      icon: 'none',
      duration: 3000
    });
  }
  
  return Promise.reject(error);
};

/**
 * 校验响应状态
 * @param {Object} response - API响应对象
 * @param {boolean} [showToast=true] - 是否显示提示
 * @returns {Promise} 校验后的Promise
 */
export const validateResponse = (response, showToast = true) => {
  if (!response) {
    return handleError(new Error('响应为空'), showToast);
  }
  
  // 接口成功
  if (response.code === 0) {
    return handleSuccess(response);
  }
  
  // 接口返回错误
  const error = {
    code: response.code,
    message: response.message || '请求失败'
  };
  
  // 特殊错误码处理
  if (response.code === 401) {
    // 未登录或登录过期
    uni.showToast({
      title: '登录已过期，请重新登录',
      icon: 'none',
      duration: 2000
    });
    
    // 跳转到登录页
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/login'
      });
    }, 2000);
  }
  
  return handleError(error, showToast);
};

/**
 * 封装API请求
 * @param {Function} apiCall - API调用函数
 * @param {boolean} [showToast=true] - 是否显示提示
 * @returns {Promise} 封装后的Promise
 */
export const apiRequest = (apiCall, showToast = true) => {
  return apiCall.then(response => validateResponse(response, showToast))
    .catch(error => handleError(error, showToast));
};

export default {
  handleSuccess,
  handleError,
  validateResponse,
  apiRequest
};
